import * as fs from 'fs';
import * as path from 'path';
import * as chokidar from 'chokidar';

// bagFunc 目录路径
const BAG_FUNC_DIR = path.resolve(__dirname, '../src/service/bagFunc');

// 模板文件内容
const TEMPLATE_CONTENT = `import { Item } from "../../shared/face/index";
import { BaseBody } from '../../core/rpg';
import { BagFuncResult } from './types';

/**
 * {functionName} 功能
 * @param useItem 使用的物品
 * @param useCount 使用数量
 * @param funcData 函数数据
 * @param player 玩家对象
 * @returns 使用结果
 */
export async function {functionName}(useItem: Item, useCount: number, funcData: any, player: BaseBody): Promise<BagFuncResult> {
    try {
        // TODO: 实现具体逻辑
        
        return {
            success: true,
            message: '功能执行成功',
            data: { action: '{functionName}' }
        };
    } catch (error: any) {
        return {
            success: false,
            message: '功能执行失败',
            data: { error: error.message }
        };
    }
}
`;

interface BagFuncWatcherOptions {
    watch?: boolean;
    create?: string;
    list?: boolean;
}

/**
 * 生成函数模板
 * @param functionName 函数名
 * @returns 模板内容
 */
function generateTemplate(functionName: string): string {
    return TEMPLATE_CONTENT.replace(/{functionName}/g, functionName);
}

/**
 * 检查文件是否已存在
 * @param filePath 文件路径
 * @returns 是否存在
 */
function fileExists(filePath: string): boolean {
    return fs.existsSync(filePath);
}

/**
 * 创建新文件并生成模板
 * @param fileName 文件名（不含扩展名）
 */
function createBagFuncFile(fileName: string): void {
    const filePath = path.join(BAG_FUNC_DIR, `${fileName}.ts`);
    
    if (fileExists(filePath)) {
        console.log(`⚠️  文件已存在: ${fileName}.ts`);
        return;
    }
    
    try {
        const template = generateTemplate(fileName);
        fs.writeFileSync(filePath, template, 'utf8');
        console.log(`✅ 已创建 bagFunc 文件: ${fileName}.ts`);
        console.log(`📝 请编辑 ${fileName}.ts 实现具体逻辑`);
    } catch (error: any) {
        console.error(`❌ 创建文件失败: ${error.message}`);
    }
}

/**
 * 监听目录变化
 */
function watchBagFuncDirectory(): void {
    console.log('🔍 开始监听 bagFunc 目录...');
    console.log(`📁 监听路径: ${BAG_FUNC_DIR}`);
    console.log('💡 提示: 在 bagFunc 目录中创建新的 .ts 文件会自动生成模板');
    console.log('📋 示例: touch src/service/bagFunc/myNewFunction.ts');
    console.log('');

    // 使用 chokidar 监听目录
    const watcher = chokidar.watch(BAG_FUNC_DIR, {
        ignored: /(^|[\/\\])\../, // 忽略隐藏文件
        persistent: true
    });

    watcher
        .on('add', (filePath) => {
            const fileName = path.basename(filePath, '.ts');
            const relativePath = path.relative(BAG_FUNC_DIR, filePath);
            
            // 只处理 .ts 文件，跳过 index.ts 和 types.ts
            if (relativePath.endsWith('.ts') && 
                relativePath !== 'index.ts' && 
                relativePath !== 'types.ts') {
                
                // 检查文件内容是否为空
                try {
                    const content = fs.readFileSync(filePath, 'utf8');
                    if (!content.trim()) {
                        console.log(`🔄 检测到新文件: ${relativePath}`);
                        createBagFuncFile(fileName);
                    }
                } catch (error) {
                    console.error(`❌ 读取文件失败: ${error}`);
                }
            }
        })
        .on('error', (error) => {
            console.error('❌ 监听器错误:', error);
        });

    console.log('✅ 监听器已启动，按 Ctrl+C 停止');
}

/**
 * 手动创建文件
 * @param functionName 函数名
 */
function manualCreate(functionName: string): void {
    if (!functionName) {
        console.log('❌ 请提供函数名');
        console.log('用法: npm run bagfunc:create <functionName>');
        return;
    }
    
    createBagFuncFile(functionName);
}

/**
 * 列出所有 bagFunc 文件
 */
function listBagFuncFiles(): void {
    console.log('📋 当前 bagFunc 文件列表:');
    console.log('');
    
    try {
        const files = fs.readdirSync(BAG_FUNC_DIR);
        const bagFuncFiles = files.filter(file => 
            file.endsWith('.ts') && 
            file !== 'index.ts' && 
            file !== 'types.ts'
        );
        
        if (bagFuncFiles.length === 0) {
            console.log('  暂无 bagFunc 文件');
        } else {
            bagFuncFiles.forEach(file => {
                const functionName = file.replace('.ts', '');
                console.log(`  ✅ ${functionName}`);
            });
        }
    } catch (error) {
        console.error('❌ 读取目录失败:', error);
    }
    
    console.log('');
}

/**
 * 主函数
 */
function main(): void {
    const args = process.argv.slice(2);
    const command = args[0];
    
    switch (command) {
        case 'create':
            manualCreate(args[1]);
            break;
        case 'list':
            listBagFuncFiles();
            break;
        case 'watch':
        default:
            watchBagFuncDirectory();
            break;
    }
}

// 如果直接运行此脚本
if (require.main === module) {
    main();
}

export {
    createBagFuncFile,
    generateTemplate,
    watchBagFuncDirectory,
    listBagFuncFiles
}; 